package cn.tedu.csmall.product.service.impl;

import cn.tedu.csmall.product.ex.ServiceException;
import cn.tedu.csmall.product.mapper.AttributeMapper;
import cn.tedu.csmall.product.mapper.AttributeTemplateMapper;
import cn.tedu.csmall.product.pojo.dto.AttributeAddNewDTO;
import cn.tedu.csmall.product.pojo.dto.AttributeUpdateDTO;
import cn.tedu.csmall.product.pojo.entity.Attribute;
import cn.tedu.csmall.product.pojo.vo.AttributeListItemVO;
import cn.tedu.csmall.product.pojo.vo.AttributeStandardVO;
import cn.tedu.csmall.product.pojo.vo.AttributeTemplateStandardVO;
import cn.tedu.csmall.product.service.IAttributeService;
import cn.tedu.csmall.product.web.ServiceCode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Slf4j
@Service
public class AttributeServiceImpl implements IAttributeService {

    @Autowired
    AttributeMapper attributeMapper;
    @Autowired
    AttributeTemplateMapper attributeTemplateMapper;

    @Override
    public void addNew(AttributeAddNewDTO attributeAddNewDTO) {
        log.debug("开始处理【添加属性】业务，新属性：{}", attributeAddNewDTO);
        int count = attributeMapper.countByName(attributeAddNewDTO.getName());
        //属性名唯一
        if(count > 0){
            String message = "添加属性失败，属性名必须唯一！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_CONFLICT, message);
        }
        // 所属的属性模板必须存在
        Long templateId = attributeAddNewDTO.getTemplateId();
        AttributeTemplateStandardVO queryResult = attributeTemplateMapper.getStandardById(templateId);
        if(queryResult == null){
            String message = "添加属性失败，属性模板不存在！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
        }
        Attribute attribute = new Attribute();
        BeanUtils.copyProperties(attributeAddNewDTO, attribute);
        attributeMapper.insert(attribute);
    }

    @Override
    public void updateInfoById(Long id, AttributeUpdateDTO attributeUpdateDTO) {
        log.debug("开始处理【修改属性】业务，被修改的属性id：{}，新属性：{}", id, attributeUpdateDTO);
        AttributeStandardVO queryResult = attributeMapper.getStandardById(id);
        // 数据必须存在
        if(queryResult == null){
            String message = "修改属性失败，尝试访问的数据不存在！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
        }
        //名称唯一
        int count = attributeMapper.countByNameAndNotId(id, attributeUpdateDTO.getName());
        if(count > 0){
            String message = "修改属性失败，属性名称已经被别的数据占用！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_CONFLICT, message);
        }
        Attribute attribute = new Attribute();
        BeanUtils.copyProperties(attributeUpdateDTO, attribute);
        attribute.setId(id);
        attributeMapper.update(attribute);
    }

    @Override
    public AttributeStandardVO getStandardById(Long id) {
        log.debug("开始处理【根据id查询属性详情】业务，ID：{}", id);
        AttributeStandardVO queryResult = attributeMapper.getStandardById(id);
        //数据必须存在
        if(queryResult == null){
            String message = "查询属性失败，尝试访问的数据不存在！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
        }
        return queryResult;
    }

    @Override
    public List<AttributeListItemVO> listByTemplateId(Long templateId) {
        log.debug("开始处理【根据属性模板id查询属性列表】业务，模板id：{}", templateId);
        List<AttributeListItemVO> list = attributeMapper.listByTemplateId(templateId);
        if(list.isEmpty()){
            String message = "根据模板id查询属性失败，尝试访问的数据不存在！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
        }
        return list;
    }


}
